Assignment 1

Problem 1 unicode1

Python 字符串底层储存的是 Unicode 码点,但是在代码层来说很多字符难以进行直接输入,所以引入了一层转义。转义过程

chr(0) 为例,这是一个 str 对象,底层储存的码点序列仅包含为 0,这个对象直接作为 Python REPL 结果的话是 '\x00',显示的结果等价于 print(repr(chr(0)))。不过,print 的输出和 REPL 回显本质上是不同的接口,他们的大体行为是一致的,即 expr 回显几乎等价于 print(repr(expr)),一个重要的例外是 None,RERP 回显的输出是空的。

Problem 2 unicode2

使用 UTF-8 的主要原因包括:节约内存,向后兼容 ASCII

错误的原因在于没有意识到 UTF-8 是变长编码,1-4 bytes 对应一个 char

2 byte 的序列只要不符合 110yyyyy 10xxxxxx 的格式或者对应的码点不在 Unicode 规范中就不构成一个合理的 Unicode char,第一点是容易构造的

Problem 3 train_bpe

data_text 按照 special_tokens 中的字符串拆成 no_spec_data_text_list: list[str]

实际上 special_tokens 之间的段并没有显式分开的需要,所以可以扁平化成一个 no_spec_data_text

然后用 PRETOKEN_PAT 模式来划分(regex.findallno_spec_data_text,并按照 UTF-8 encoding 成 pretoken_data_bytes: list[bytes]

merge 部分的思路